/*
 * @lc app=leetcode.cn id=59 lang=java
 *
 * [59] 螺旋矩阵 II
 */

// @lc code=start
class Solution {
    // 54是读螺旋矩阵，这个是根据数字写螺旋矩阵
    // 总的来说套路和54题一样
    // 先列标志数组，在把[0,0]位置的处理，然后螺旋处理其他位置的。
    // 这两道题的处理时间都很快，那么优化方法其实就是不用visited标志数组，而改用一些判断条件来处理
    public int[][] generateMatrix(int n) {
        int[][] ans = new int[n][n];
        boolean[][] visited = new boolean[n][n];//标记是否访问过

        ans[0][0] = 1;//从1 开始填
        visited[0][0] = true;//标记访问过

        int N = n*n ,total = 1;//从1开始计
        int x=0,y=0;//遍历坐标

        while(total!=N){
            while(y+1<n && !visited[x][y+1]) {
                ans[x][++y] = ++total;
                visited[x][y]=true;
            }
            while(x+1<n && !visited[x+1][y]) {
                ans[++x][y] = ++total;
                visited[x][y]=true;
            }
            while(y-1>=0 && !visited[x][y-1]) {
                ans[x][--y] = ++total;
                visited[x][y]=true;
            }
            while(x-1>=0 && !visited[x-1][y]) {
                ans[--x][y] = ++total;
                visited[x][y]=true;
            }
        }

        return ans;
    }
}
// @lc code=end

